home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_400 / 423_01 / recio200 / rgets.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-04-15  |  4.3 KB  |  126 lines

  1. /*****************************************************************************
  2.    MODULE: rgets.c
  3.   PURPOSE: recio character delimited string and char input functions
  4. COPYRIGHT: (C) 1994 William Pierpoint
  5.  COMPILER: Borland C Version 3.1
  6.        OS: MSDOS Version 6.2
  7.   VERSION: 2.00
  8.   RELEASE: April 15, 1994
  9. *****************************************************************************/
  10.  
  11. #include <ctype.h>
  12. #include <errno.h>
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <string.h>
  16.  
  17. #include "recio.h"
  18.  
  19. extern int _rstatus(REC *rp, int mode);
  20. extern char *_rfldstr(REC *rp, size_t len);
  21. extern char *_rerrs(REC *rp, int errnum);
  22.  
  23. #define rflags(rp)       ((rp)->r_flags)
  24. #define rcol(rp)         ((rp)->r_colno)
  25. #define rreclen(rp)      ((rp)->r_reclen)
  26.  
  27. /****************************************************************************/
  28. int                          /* return character; EOF=error or missing data */
  29.     str2c(                   /* convert string to character                 */
  30.         const char  *nptr,   /* pointer to string to convert                */
  31.               char **endptr) /* pointer to conversion leftover string       */
  32. /****************************************************************************/
  33. {
  34.     int ch=EOF;              /* result to return */
  35.  
  36.     errno = 0;
  37.  
  38.     /* set *endptr to nptr just in case conversion fails */
  39.     if (endptr) *endptr = (char *) nptr;
  40.  
  41.     /* skip over white space */
  42.     while (isspace(*nptr)) nptr++;
  43.     
  44.     /* if string contains a non-whitespace character */
  45.     if (*nptr != '\0') {
  46.         
  47.         /* get the character */
  48.         ch = (int) *nptr;
  49.         
  50.         /* position endptr just past the character */
  51.         if (endptr) *endptr = (char *) ++nptr;
  52.     } 
  53.     return (ch);
  54. }
  55.  
  56. /****************************************************************************/
  57. int                          /* return pointer to char; EOF on error        */
  58.     rgetc(                   /* get character from record stream            */
  59.         REC *rp)             /* record pointer                              */
  60. /****************************************************************************/
  61. {
  62.     int result=(EOF);        /* character to return */
  63.     int ch;                  /* conversion character */
  64.     char *fldptr;            /* pointer to field string */
  65.     char *endptr;            /* pointer to first invalid field char */
  66.  
  67.     if (!_rstatus(rp, R_READ)) {
  68.       fldptr = _rfldstr(rp, 0);
  69.       if (fldptr) {
  70.         for (;;) {
  71.           if (*fldptr != '\0') {
  72.             endptr = fldptr;
  73.             ch = str2c(fldptr, &endptr);
  74.             while (isspace(*endptr)) endptr++;
  75.             if (!*endptr) {
  76.                 result = ch;
  77.                 break;
  78.             } /* invalid data */
  79.             fldptr = _rerrs(rp, R_EINVDAT);
  80.             if (fldptr) continue;
  81.           } /* missing data */
  82.           fldptr = _rerrs(rp, R_EMISDAT);
  83.           if (fldptr) continue;
  84.           break;
  85.         }
  86.       } /* null pointer */
  87.     }
  88.     return result;
  89. }
  90.  
  91. /****************************************************************************/
  92. char *                       /* return pointer to string; "" on error       */
  93.     rgets(                   /* get string from record stream               */
  94.         REC *rp)             /* record pointer                              */
  95. /****************************************************************************/
  96. {
  97.     static char empty[]="";  /* empty string */
  98.     char *retp=empty;        /* return pointer */
  99.     char *fldp;              /* pointer to field buffer */
  100.  
  101.     if (!_rstatus(rp, R_READ)) {
  102.  
  103.         /* if field position is within record */
  104.         if (rcol(rp) <= rreclen(rp)) {
  105.             fldp = _rfldstr(rp, 0);
  106.             if (fldp) {
  107.                 /* if str empty */
  108.                 if (!*fldp) {
  109.                     rsetwarn(rp, R_WEMPSTR);
  110.                     retp = rflds(rp);
  111.                 } else {
  112.                     retp = fldp;
  113.                 }
  114.             }
  115.  
  116.         /* else beyond end of record */
  117.         } else {
  118.             rfldno(rp)++;
  119.             rsetfldstr(rp, "");
  120.             rsetwarn(rp, R_WEMPSTR);
  121.             retp = rflds(rp);
  122.         }
  123.     }
  124.     return (retp);
  125. }
  126.